package cn.dwy2002.binaryhandwritingserver.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 接口返回类
 *
 * @author 杜伟毅
 * @version 1.0
 * @since 2024/11/02
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    private Integer code;
    private String message;
    private T data;

    //2XX --------------------------------------------------------

    /**
     * 用途：请求成功。
     * 示例：GET 请求成功获取资源。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> success200(String message, T data) {
        return new Result<>(200, message, data);
    }

    /**
     * 用途：请求成功并且新资源被创建。
     * 示例：POST 请求成功创建资源。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> success201(String message) {
        return new Result<>(201, message, null);
    }

    /**
     * 用途：请求成功，但没有返回内容。
     * 示例：DELETE 请求成功删除资源，不需要返回内容。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> success204(String message) {
        return new Result<>(204, message, null);
    }

    //4XX --------------------------------------------------------

    /**
     * 用途：客户端发送的请求包含语法错误或无效参数。
     * 示例：登录请求中缺少手机号或手机号为空。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> fail400(String message) {
        return new Result<>(400, message, null);
    }

    /**
     * 用途：请求需要用户认证。
     * 示例：客户端未提供有效的身份验证凭据（如 JWT token）
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> fail401(String message) {
        return new Result<>(401, message, null);
    }

    /**
     * 用途： 服务器理解请求，但拒绝执行。客户端没有访问资源的权限。
     * 示例：用户认证成功，但没有权限访问某些资源。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> fail403(String message) {
        return new Result<>(403, message, null);
    }

    /**
     * 用途：服务器无法找到请求的资源。
     * 示例：请求的资源不存在或路径错误。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> fail404(String message) {
        return new Result<>(404, message, null);
    }

    //5XX --------------------------------------------------------

    /**
     * 用途：服务器内部错误，无法完成请求。
     * 示例：服务器端代码抛出未处理的异常。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> error500() {
        return new Result<>(500, "服务器内部错误，无法完成请求,请联系系统管理员", null);
    }

    /**
     * 用途：服务器内部错误，无法完成请求。
     * 示例：服务器端代码抛出未处理的异常。
     *
     * @author 杜伟毅
     * @since 2024/11/27 0027 12:49
     */
    public static <T> Result<T> error503() {
        return new Result<>(503, "服务器正在维护", null);
    }


//    public static <T> Result<T> success() {
//        return new Result<>(200, "success", null);
//    }
//
//    public static <T> Result<T> success(T data) {
//        return new Result<>(200, "success", data);
//    }
//
//    public static <T> Result<T> success(String message) {
//        return new Result<>(200, message, null);
//    }
//
//    public static <T> Result<T> success( String message,T data) {
//        return new Result<>(200, message, data);
//    }
//
//    public static <T> Result<T> fail() {
//        return new Result<>(401, "fail", null);
//    }
//
//    public static <T> Result<T> fail(Integer code) {
//        return new Result<>(code, "fail", null);
//    }
//
//    public static <T> Result<T> fail(String message) {
//        return new Result<>(401, message, null);
//    }
//
//    public static <T> Result<T> fail(Integer code, String message) {
//        return new Result<>(code, message, null);
//    }
//
//    public static <T> Result<T> error(T data) {
//        return new Result<>(500, "服务端错误，请联系技术人员", data);
//    }

}
